Comment exécuter une méthode à partir d'un script dans majordomo. Majordome

De nombreux débutants ne parviennent pas à se lier d'amitié avec MajorDoMo, car ce système, à première vue, leur semble plutôt compliqué.En fait, la structure de MajorDoMo est très simple. Toute sa « complexité » n'est rien de plus qu'une duplication des emplacements de stockage de code, mis en œuvre uniquement pour des raisons de commodité.

Essayons de regarder cela de plus près. Tout ce que nous faisons est implémenté, pour la plupart, en utilisant du code PHP. Il se compose à son tour de fonctions de base et d'un petit nombre de commandes propres à MajorDoMo.

Pour faciliter la compréhension et la mise en œuvre, vous pouvez placer le code à différents endroits. Pour la compréhension, je vais donner un exemple simple de cette approche. Supposons que nous ayons besoin d'exécuter un code absolument identique, à la fois en appuyant sur un bouton dans le menu et par commande vocale. Nous pouvons écrire ce code directement à la fois sur le bouton de menu et sur la commande vocale. Encombrant n'est-ce pas ? Ou nous pouvons le mettre dans un script, puis appeler ce script de n'importe où avec une seule ligne. C'est en fait tout le secret de cette apparente complexité. 🙂

D'où la formule simple. Si du code est prévu pour être exécuté à partir d'un endroit, nous l'écrivons directement à partir de là et nous l'exécuterons. Si vous avez besoin d'y accéder depuis au moins deux endroits, vous devriez déjà penser au script.

Où sont ces endroits pour le code ?

  • Eh bien, bien sûr, ce sont des scripts. (Menu Administration/OBJETS/Scripts ).
  • Méthodes (Menu Administration/OBJETS/Objets ), dont je parlerai plus en détail plus tard.
  • Menu (Menu Administration/OBJETS/Menu Contrôle ).
  • Commande vocale (Menu Administration/OBJETS/Comportements ).
  • Contrôle visuel sur le plan du bâtiment (Menu Administration/OBJETS/Scènes ).
  • Extraction de données à partir de pages Web (analyse) (Menu Administration/OBJETS/Variables Web ).

En fait, pour la plupart, c'est tout et c'est limité. Tout le reste est intuitif et saisit à la volée.

Scénarios.

Avec Scénarios, tout est clair. En eux, nous prescrivons le code que nous voulons exécuter à partir de différents endroits.

Menu, commande vocale et scènes.

En eux, nous écrivons les indicateurs, boutons, interrupteurs, régulateurs les plus chers ...

Ils peuvent s'écrire :

  1. Tout code.
  2. Passage direct au script (en sélectionnant un script préparé à l'avance dans la liste).
  3. Type mixte (par exemple, quand on travaille un morceau de code directement dans un bouton, par exemple, son indication, puis aller dans le script et faire ce qui y est écrit).

Analyse.

Pour la plupart, l'analyse ici consiste à extraire des données des pages d'autres personnes présentées sur le réseau en définissant le début et la fin du morceau de texte requis. PHP joue ici un rôle plutôt auxiliaire et est relativement rarement utilisé.

Voici un exemple. Disons que vous devez obtenir la température du site, conditionnellement "Forecaster". Nous utilisons des caractères spéciaux pour indiquer le début et la fin du morceau de texte dont nous avons besoin (que ce soit le numéro de la température actuelle). De plus, avec une certaine fréquence que nous fixons, ce numéro est lu et écrit dans la propriété. Plus sur les propriétés plus tard. Pour l'instant, sachez simplement que le chiffre lu est stocké avec nous dans un certain endroit jusqu'à ce qu'il change. Dès que cela se produira, le chiffre changera à cet endroit (propriété). Nous traitons le paramètre (chiffre de température) enregistré dans la propriété de la manière nécessaire. Supposons, pour le menu, que nous ajoutions les mots avant le numéro affiché : "Dans la rue: " et alors "°C » .

Voici à quoi cela ressemble dans le code :Extérieur : %ThisComputer.Sinoptik_temp%°C

Dans la rue: Et°C ce n'est que du texte.

MAIS:ThisComputer.Sinoptik_temp juste notre propriété, oùCet ordinateur c'est une classe etSinoptique_temp c'est une propriété de cette classe, et le point est utilisé comme délimiteur. Vous comprendrez tout cela en lisant ci-dessous. Oh oui, les % sont des délimiteurs pour le menu, les guillemets sont généralement utilisés dans le code.

En conséquence, dans notre menu, nous voyons toujours la température actuelle du site.

Objets.

Et enfin, nous avons encore des objets, l'endroit même où se trouvent nos propriétés et pas seulement. Les objets aussi, à première vue, semblent être une chose compliquée. Mais ce n'est qu'à première vue. 🙂

Un objet c'est une représentation de quelque chose, par exemple : un ordinateur (comme dans l'exemple ci-dessus), ou un réveil, ou une minuterie, ou même Skype... En général, n'importe quoi.

Il peut y avoir plusieurs objets identiques. Eh bien, par exemple. Rappelez-vous quand j'ai écrit comment je vois le système, j'ai dit que nous aurons une station météo avec des unités intérieures et extérieures. Ainsi, les deux blocs sont assemblés sur des modules ESP-12 absolument identiques. Chacun d'eux est un objet, et leur totalité estClasser . Ici, tout est également fait pour la commodité et l'exclusion de l'écriture inutile, vous comprendrez plus loin.

La structure ici est la suivante :

1. Classer appareils identiques, appelons-le conditionnellement ESP (puisque nous avons pris les modules ESP comme exemple).

1.1. Ceclasser vous pouvez définirPropriétés (si, de façon simple, en mettant en placeSalle de classe ESP biensTempérature il apparaîtra automatiquement en chacun de nousobjets de classe ESP , c'est-à-dire qu'il ne sera pas nécessaire de créerbiens , pour chaqueobjet ).

1.2 Ceclasser , vous pouvez également définirméthodes (c'est-à-dire l'exécution d'un certain code, cesméthodes égalementPropriétés apparaissent dans tous nosobjets ).

1.3. Et enfin, bien sûr,Salle de classe mangerobjets . Ce sont déjà, directement, nos ESP physiques : ESP-12 n°1, ESP-12 n°2, etc.

Tousun objet (ESP-12 #1, ESP-12 #2, etc.), à son tour, a son proprePropriétés Etméthodes .

Les propriétés sont de deux types. propriétés de classe Et Propriétés de l'objet leur différence réside dans le fait que les propriétés enregistrées dans la classe apparaissent automatiquement dans tous les nouveaux objets, et les propriétés ajoutées à l'objet ne sont que dans celui-ci. Ceci est fait afin, d'une part, de se débarrasser de l'écriture inutile, et d'autre part, de fournir des informations individuelles Propriétés. Méthodes sont créés uniquement dans la classe et sont déjà enregistrés uniquement dans l'objet.

Je vais vous expliquer avec un exemple :

Disons que nous avons ESP-12 #1 et ESP-12 #2. Nous devons mesurer la température sur les deux, mais en plus de cela, nous devons également mesurer l'humidité sur le premier et utiliser le second pour contrôler le relais.

En faisantClasser ESP , on y écritbiens Température . Il apparaîtra automatiquement dans les propriétés de l'ESP-12 #1 et de l'ESP-12 #2. Plus directement, pour l'ESP-12 n°1, déjà dans sonPropriétés , nous prescrivonsHumidité . DANSPropriétés même, ESP-12 n ° 2, nous enregistrons le relais. En conséquence, nous avons ESP-12 n ° 1 avec des propriétés dans lesquelles le système enregistrera les valeurs de température et d'humidité et ESP-12 n ° 2 avec des propriétés dans lesquelles le système enregistrera la valeur de température et l'état du relais (0-Arrêt, 1-Marche). Et, en conséquence, méthodes qui nous aidera à traiter ces mêmes données, s'il y a un besoin pour cela, nous le commencerons dans la classe ESP, et nous y écrirons déjà le code personnellement pour chaque objet.

Il convient de noter que les méthodes peuvent être appelées de n'importe où. callMethod("Object.Method", $params); ou alternative cm cm("Objet.Méthode", $params);. Les propriétés sont également globales et peuvent être appelées de n'importe où. Les fonctions sg(setGlobal) et gg (getGlobal) font exactement cela. Par exemple la ligne :getURL(gg('AlarmOne.UrlAlarmRing'),0); ouvrira le lien stocké dans la propriétéAlarmOne.UrlAlarmRing

Maintenant c'est sûr, vous avez tout pour comprendre le fonctionnement de MajorDoMo.

Corrigeons cela avec un exemple concret :

Nous avons flashé le firmware de wifi-iot.com sur nos modules ESP-12 #1 et #2. Le premier lit la température et l'humidité, et le second lit la température et contrôle le relais. Les deux ESP-12 envoient des données à MajorDoMo à intervalles réguliers, où elles sont reçues par un script qui décompose les données reçues en propriétés. Et enfin, nous prenons ces données des propriétés et les utilisons à notre discrétion, c'est-à-dire que nous insérons déjà la propriété nécessaire là où elle doit être affichée ou appliquée.

Par exemple, nous prenons les températures de la rue et de la pièce, les traitons dans un certain scénario, obtenant ainsi un thermostat intelligent.

De plus, à partir des mêmes propriétés, nous prenons tous la même température et l'affichons dans le menu ou sur la scène pour une présentation visuelle.

Et le matin, la méthode lancée à partir de l'objet Réveil lancera pour nous un script qui, une fois que nous nous serons enfin réveillés et que nous aurons éteint la mélodie, nous lira vocalement le bulletin météo actuel. Et d'où pensez-vous qu'il tire les chiffres de la température et de l'humidité ? Exactement, des propriétés!

Et vous pouvez construire autant de ces options que vous le souhaitez, tant qu'il y a suffisamment d'imagination, ici vous avez la flexibilité que j'ai promise.

Et après?

Eh bien, maintenant que vous comprenez déjà la structure de MajorDoMo, je vais vous parler de la matrice HDMI, où nous verrons déjà l'interaction des appareils dans MajorDoMo. Et enfin, je passerai à une présentation plus sérieuse, avec du code, des images, des schémas et autres délices... En général, assez de théorie nue, maintenant pour l'essentiel il y aura de la pratique.

Donc matrice HDMI 4×2 4K x 2K 3D.

    Je dois dire tout de suite que j'essaie de réduire au maximum les images pour qu'elles puissent être visualisées même sur un smartphone en orientation page, mais cela ne fonctionne pas toujours 🙁 . Si vous voyez que le texte des commentaires dépasse les bordures, il suffit de tourner le smartphone sur le côté (orientation Paysage), les smartphones, c'est différent.

    En analysant mon blog, je suis tombé sur plusieurs requêtes de recherche, telles que : - Où se trouve le fichier menu.html ou scenes.html etc.
    Les réponses à ces questions sont très simples pour leur consacrer un blog séparé. Je vais donc y répondre dans les commentaires.
    Par défaut, tous les fichiers qui forment l'apparence du terminal se trouvent dans le dossier /templates ; si vous avez déjà installé un skin tiers, ces fichiers doivent être recherchés dans le dossier /templates_alt. Le dossier /templates_alt a une priorité plus élevée que /templates et tout ce qu'il contient est traité en premier. S'il manque quelque chose, le moteur se tourne vers le dossier /templates pour celui qui manque. Eh bien, probablement, sur la base de ce qui précède, il convient de noter que si vous allez mettre votre propre modèle (skin) sur MajorDoMo, vous devez créer le dossier /templates_alt (s'il n'a pas encore été créé) et effectuer toutes les expériences dans ce. Cela vous évitera de perdre tout ce que vous avez reçu par défaut en cas de panne.

    Il y avait aussi cette demande : -MajorDoMo n'accepte pas les données...
    MajorDoMo reçoit des données, généralement en exécutant une sorte de script qui reçoit ces données ou les lit, puis le script les place dans les propriétés que vous avez préparées pour cette propriété, à partir desquelles les données dont vous avez besoin sont ensuite lues et utilisées. Ces scripts sont généralement exécutés ; Soit depuis l'extérieur, depuis un serveur tiers (enfin, disons, comme dans le cas de l'ESP8266, qui, en envoyant des données, lance le script espdata), c'est ainsi que nous on a données (d'ailleurs, dans un avenir proche, je vous raconterai tout cela plus en détail dans mon article sur la station météo). Ou sur une minuterie pour considérer données de n'importe où. Il existe des mécanismes prêts à l'emploi, par exemple, un mécanisme similaire est intégré dans des variables Web qui interrogent la page cible à une certaine fréquence. Dans le cas décrit, la fréquence est précisée dans le champ Vérifier l'intervalle, une variable Web spécifique. Par exemple, de cette façon, nous obtenons l'heure du lever et du coucher du soleil. La variable Web prend la valeur de temps d'un site météo, l'écrit dans la propriété, puis, déjà dans la méthode, nous effectuons le traitement (en d'autres termes, nous comparons l'heure actuelle avec l'heure du coucher du soleil), à la suite de quoi Alice, exactement au bon moment, nous dit - Le soleil se couche. et, si nécessaire, effectue des actions, ou 🙂 lance le script dont nous avons besoin.
    Donc, si MajorDoMo n'accepte aucune donnée, tout d'abord, il vaut la peine de trouver un script ou une source (par exemple, comme dans le cas d'une variable Web) qui en est responsable et de vérifier ses performances. Pour cela, tous les mécanismes sont prévus, depuis le lancement élémentaire du script, directement depuis ses paramètres, en cliquant sur le lien prescrit sur la page de ses paramètres, et jusqu'à l'analyse des logs, comme, par exemple, est disponible en web variables.

    Et enfin, la troisième requête que j'ai vue : -Objets simples MajorDoMo
    Ici, il convient de noter que la requête a été construite un peu incorrectement. Mais objet tout peut être, récemment un concept supplémentaire a été introduit dans le système : Appareils simples. Cela a été fait pour faciliter la vie des débutants. Pour être honnête, je ne l'ai pas encore utilisé, du fait que je travaille, juste au niveau de ces mêmes objets. Mais pour diriger le petit homme sur le vrai chemin : (Simple Devices) pourrait, littéralement, en quelques secondes. Alors n'hésitez pas à vous inscrire et à demander dans les commentaires. En tout cas, je les considère beaucoup plus souvent que j'analyse les requêtes de recherche.

    Je suis assis, en train d'écrire tranquillement un article sur la théière, mais ça me lave, regarde la métrique. J'ai abandonné et j'ai décidé de jeter un coup d'œil. Et je vois une autre requête de recherche : - Structure de la base de données MajorDoMo
    Il est difficile de répondre immédiatement à cette question, ne sachant pas au départ ce que la personne voulait précisément. La structure, au fur et à mesure que le système est rempli, sera différente pour chacun, quelqu'un installera tel ou tel module, telle ou telle application, et quelqu'un n'en aura pas besoin ... Les tableaux, respectivement, ont également des champs loin d'être typiques. Donc, à ce stade je vais donner ma liste, et là, si quelqu'un est intéressé par quelque chose de précis, demandez et on regardera.

    Enquête: Comment écrire une valeur à une propriété ?
    Réponse : Dans la plupart des cas, la valeur de la propriété est écrite automatiquement, cependant, cela peut être fait manuellement. Lisez l'article sur le socket Broadlink SP3 et vous n'aurez plus jamais de telles questions.

    Enquête: MajorDoMo, des variables de température web ?
    Réponse : Un article séparé sera probablement consacré aux variables Web afin de donner une idée de la chose la plus, à première vue, la plus difficile qui soit là, à savoir le filtrage. Jusqu'à présent, une réponse précise à une question précise.
    Nous prendrons la température actuelle du site Forecaster en raison de sa stabilité et de sa constance.
    Créer une variable Web avec Nom: Sinoptique_temp
    DANS Lien nous écrivons : https://sinoptik.com.ru/weather-Volgograd Dans votre cas, Volgograd est remplacé par votre ville.
    DANS Modèle de recherche :

    Objet connexe : Cet ordinateur
    Biens: Sinoptique_temp cette propriété doit être créée sur l'objet This Compuer (lire cet article et l'article socket SP3).
    Intervalle de vérification : 600
    C'est tout, maintenant toutes les 10 minutes, Mzhor lira la température actuelle de votre ville à partir du prévisionniste et l'écrira dans la propriété Sinoptik_temp, avec laquelle vous pourrez faire ce que vous voulez, l'afficher dans des scripts, etc ...

    Enquête: MajorDoMo, le soleil se couche-t-il ?
    Réponse : Dans MajorDoMo, il existe deux modes, à savoir le mode nuit et le mode sombre. Mode nuit, s'allume toutes les heures, par défaut de 20h00 à 8h00. Ce mode est très pratique, par exemple, pour désactiver l'annonce vocale. Mode, heure sombre de la journée, s'allume au coucher du soleil et s'éteint au lever du soleil, ce mode est pratique, par exemple, pour contrôler l'éclairage public. Les données spécifiques à la localité sont obtenues en appliquant des variables Web. Qui sont ensuite stockés dans les propriétés ThisComputer.SunRiseTime et ThisComputer.SunSetTime et traités dans la méthode onNewMinute de la classe Timer.

    Enquête: Variables globales MajorDoMo ?
    Réponse : Les fonctions gg (getGlobal) et sg (setGlobal) parlent d'elles-mêmes, eh bien, et nos propriétés, compte tenu du fait qu'elles ont tendance à changer, sont ces mêmes variables globales. Disons que nous avons un certain scénario et que nous devons faire quelque chose avec la propriété, disons, changer le seuil de température du thermostat. En utilisant la fonction getGlobal, nous prenons la valeur de la propriété dans notre script et l'écrivons dans une variable locale, soit : $temp_term. Avec cette variable locale, dans notre script, nous effectuons déjà les transformations dont nous avons besoin, et enfin, nous écrivons l'état modifié de $temp_term, en utilisant la fonction setGlobal, dans la propriété. Eh bien, avec la propriété, comme nous le savons déjà, nous pouvons faire ce que nous voulons. Par exemple, afficher sa valeur à l'écran, l'envoyer à un thermostat physique, ou même parler à travers les haut-parleurs du système... Au fait, en parlant de variables globales, il convient de noter les fonctions intégrées du système. Il faut se rappeler qu'il existe un certain ensemble de fonctions et de variables qui sont implémentées, purement, pour le système. Rappelez-vous que j'ai mentionné que la plupart du temps, nous travaillons avec PHP, mais il y a aussi quelque chose d'intégré ? Vous pouvez voir les fonctions intégrées. Et quand vous regardez, faites attention à l'item "Gestion des cycles (services)", là vous tomberez juste sur une variable globale intégrée et comprendrez que la méthodologie est la même partout.

    Enquête: Le bloc html MajorDoMo utilise la valeur de la variable ?
    Réponse : Je fais, par exemple, comme ceci : Extérieur : %ESP8266003b5df7.dhtt1%°C(c'est-à-dire que j'écris le symbole ° à partir du clavier) puis la mise en page est à la hauteur des conneries. Le symbole du degré est réglé sur ALT + 0176, les chiffres sont tapés sur la partie numérique du clavier (LIEN VERS WIKEPEDIA).
    Certains font des choses comme ça :
    %KitchenMain.dhtt1%°C et puis il faut mettre C exclusivement en version anglaise. Personnellement, je ne l'ai pas essayé, mais cela a été dit : (LIEN VERS LE FORUM).
    Attention! Si quelqu'un décide de copier-coller : %KitchenMain.dhtt1%°C gardez à l'esprit qu'il est affiché ici sur le blog non pas comme un symbole de degré, mais comme ° J'ai remplacé la lettre anglaise dans le code du caractère e en russe, n'oubliez pas de revenir en arrière !
    Bon et ainsi de suite... Bla, bla, bla : %OBJECT.PROPERT% bla, bla, bla. Blah, bla, bla dans n'importe quelle langue, même en chinois.
    Si vous avez besoin, par exemple, d'afficher l'humidité, procédez comme suit : %ESP8266003b5df7.dhth1%% le deuxième % ne sera qu'un symbole.

    Enquête: Faire tourner le script majordomo toutes les heures ?
    Réponse : Allez dans la méthode : OBJECTS / Objects / Timer / onNewMinute et à la toute fin ajoutez :

    Si ($m=="10") (
    runScript("NOM DU SCRIPT");
    }

    N'oubliez pas de cliquer sur le bouton "Mettre à jour"
    Le script sera exécuté toutes les dix minutes de l'heure.

    Enquête: MajorDoMo comment définir le chemin vers d'autres pages ?
    Répondre:
    1. Si vous souhaitez que votre page ressemble à un onglet, vous devez vous rendre sur : Menu Admin principal/PARAMÈTRES/Pages d'accueil, cliquez sur le bouton "Nouvelle page", Dans le champ Nom(*)écrire le nom de l'onglet, dans la liste Taper sélectionner URL, dans le champ Lien, écrivez l'adresse de la page. Pour les pages locales, il suffit de spécifier le chemin local, par exemple : /Template_alt/pagename.html . Si vous avez une page dans son propre dossier et qu'elle a un fichier d'index, il vous suffit de spécifier le dossier, par exemple : /Kinoteatr/

    2. Supposons que vous souhaitiez insérer un site Web d'Internet dans MajorDoMo afin de l'utiliser tout le temps. C'est très simple. Pour ce faire, vous devez utiliser l'application "Liens envoyés" ( Lis le sur le marché des compléments).
    Exemple. Vous avez un navigateur au travail. Création d'un signet de navigateur avec Titre: Envoyer à MJD et sur le terrain URL prescrire:

    javascript :(fonction())(varhost=" Adresse de votre MajorDoMo"; var title=prompt("Title:", document.title); if (title!="" && title!=null) (location.href="http://"+host+"/popup/app_readit.html ?ajax=1&op=add&url="+encodeURIComponent (location.href)+"&title="(!LANG:+encodeURIComponent(title);))());

    N'OUBLIEZ PAS DE CHANGER : Adresse de votre MajorDoMo !!!
    Nous le mettons à un endroit bien en vue, par exemple dans la barre de favoris (qui, bien sûr, doit d'abord être affichée).
    Maintenant, quelle que soit la page sur laquelle vous vous trouvez, cliquez simplement sur cet onglet et la page apparaîtra dans MajorDoMo, dans l'onglet Liens. Faites attention là (dans l'onglet Liens ouvert) à la petite icône dans le coin supérieur gauche, en cliquant dessus vous ouvrirez un menu où vous pourrez : Sélectionner une page qui sera affichée en permanence dans le cadre (dans l'onglet), Ajoutez une nouvelle page manuellement (si pour une raison quelconque vous ne voulez pas utiliser de signet), et enfin prenez le lien même pour créer un signet (Attention ! Si vous prenez un lien à partir de là, faites attention à : host="mycomp" !} moncomp il s'agit d'un lien vers votre MajorDoMo, en règle générale il peut y avoir une IP locale, il faudra la changer soit en une IP externe soit en un nom de domaine. En général, je vous conseillerais d'utiliser un nom de domaine, c'est plus pratique en tout point. Ainsi, par exemple, avoir un nom de domaine à l'extérieur et enregistrer son association dans le réseau local, vous n'aurez qu'un seul lien que vous pourrez utiliser partout, c'est très pratique lorsque vous travaillez avec des applications mobiles, Tasker, etc. pas besoin d'espérer changer quelque chose lorsque vous êtes à la maison et ensuite à l'extérieur).

    3. Enfin, si vous le souhaitez, vous pouvez insérer votre page directement dans la scène. Eh bien, par exemple, si vous avez une page toute faite avec un groupe de boutons, etc. En savoir plus ici : (LIEN)

    Enquête: Lancement de la méthode objet MajorDoMo ?
    Réponse : La méthode est appelée par la ligne :

    callMethod("Object.Method", $params);

    Plus tôt, dans un commentaire sur les variables globales, j'ai écrit sur les fonctions internes et cité (LINK), au même endroit dans la section "Travailler avec des objets", vous trouverez également sur les méthodes.

    Enquête: Comment écrire une valeur d'une propriété d'un objet à une propriété d'un autre ?
    Réponse : Pour commencer, il convient de déterminer pourquoi cela est nécessaire. Ceci est nécessaire, par exemple, lorsque vous devez créer appareil simple , disons un capteur de température, et physiquement vous avez un appareil complexe, par exemple, un module ESP, auquel de nombreux capteurs sont connectés, dont un capteur de température. Mais, compte tenu du fait que l'ESP n'est pas un simple appareil et que le script d'écriture de tous ses capteurs est composite (c'est-à-dire que la valeur est écrite dans la propriété en composant l'identifiant en tant qu'objet et, en fait, la propriété. En bref, le code est un, et les données sont écrites dans les propriétés de différents ESP ), son utilisation directe dans des appareils simples est impossible.
    La façon de procéder?
    1. Créer appareil simple , capteur de température. En sortie, nous obtiendrons une paire de Object.Property, par exemple : Sensor_temp01.value rappelons-le.
    2. Découvrez le nom du capteur de température de l'ESP qui nous intéresse (disons que nous voulons utiliser le capteur de température du BME-280, qui est connecté au premier module ESP que nous avons dans le hall), allez aux propriétés du hall ESP et voyons que nous avons un capteur de température appelé : ESP8256007b5b6d.bmet, Souviens toi.
    3. Créons un script qui écrira la valeur de la propriété de température ESP dans la propriété de température d'un appareil simple toutes les minutes. Appelons-le : Association de capteurs
    Et écrivez le code pour cela:

    // Écrit des données toutes les minutes depuis ESP8256007b5b6d.bmet vers Sensor_temp01.value
    $templ = getGlobal("ESP8256007b5b6d.bmet");
    setGlobal(("Sensor_temp01.value"),$templ);

    Sauvons notre script !

    4. Et enfin, mettez le script à exécuter toutes les minutes dans la méthode timer : surNouvelleMinute

    Enquête: Indicateurs MajorDoMo ?
    Réponse : Beaucoup de débutants sont souvent bloqués sur cette question. Oui, en effet, sans une connaissance approfondie de la structure, et en particulier des motifs, les indicateurs ne sont pas si faciles à trouver, mais connaître l'endroit exact où ils se trouvent ne sera, absolument, aucun problème. La première chose que je voudrais dire est que les indicateurs font partie du modèle, c'est-à-dire soi-disant Faces Web ou (front-end, si vous préférez), alors ? c'est là qu'il faut les chercher. Et ainsi, nous pouvons avoir une muselière Web à deux endroits. 1. Si vous utilisez le modèle standard, vous devriez probablement le rechercher ici : /www/templates/default.html 2. Si, comme moi, vous avez appliqué un modèle alternatif et que vous suivez en même temps les règles des nobles webmasters, ne chiez pas le défaut (ce que l'auteur donne par défaut), on ne sait jamais, et du coup il faut le refaire plus joliment. Ensuite, à coup sûr, vous devriez regarder dans le modèle alternatif : /www/templates_alt/default.html . Nous avons choisi le modèle, ouvrez le fichier dans un éditeur de texte : default.html et pour que vous ne vous promeniez pas dans le texte lourd, à la recherche du bon, nous recherchons la ligne dans le fichier : System.IndicatorColorSystem.IndicatorColor c'est une propriété (dont la valeur est une image) de l'état du système, indicateur numéro un ! Il est toujours présent, en ajoutant à sa ressemblance les propriétés dans lesquelles se trouvent des images, vous obtiendrez autant d'indicateurs nécessaires que vous le souhaitez sur la page principale.

    Mais ce n'est pas tout. Ici, sur cette page (LIEN), mon modèle est présenté comme l'illustration principale, et si vous regardez attentivement, vous remarquerez que les indicateurs ont une place pour être non seulement à droite dans le modèle principal, mais aussi dans le menu. Ce n'est pas un caprice et pas un non-sens, car, par défaut, que j'utilise dans MajorDroid, vous ne pouvez pas voir la page principale, là la page principale est le menu (je vais faire une réservation, c'est dans mon cas, car si vous le souhaitez, vous pouvez y afficher la scène par défaut !) par conséquent, vous pouvez également voir des indicateurs en double dans le menu.
    Où les chercher ? C'est simple, vous devrez les fabriquer vous-même si vous en avez vraiment besoin.
    Alors comment faire ?
    Création d'un élément de menu avec Titre: État et placez-le tout en haut de votre menu ( Priorité: 100000 ), élément parent :, bien sûr, devrait être RACINE.
    DANS Taper: choisir Bloc HTML.
    Dans le champ Données :, écrivez le code suivant :

    Ceci est ma version, vous éditez par vous-même, quoi, comment et où se trouve, vous comprendrez déjà sans difficulté. Et désolé pour la photo, c'est juste que mon système est tellement arrangé qu'il capte ce code. Il faudra donc le réécrire à la main. Attention : Liquid_Crystal est une fonte qui imite une horloge LCD, c'est dans ce style que mon template est fait, si vous voulez le même il faudra le télécharger vous-même, si ça ne vous dérange pas, alors si vous ne trouvez pas Liquid_Crystal, le système connectera Arial, mais écrivez-le déjà en haut.
    Et enfin, dans le paragraphe : Période de mise à jour automatique :écrire 10 seconde.
    Enregistrez et obtenez ce que vous voulez.

dire($ph,$niveau)-- dit une phrase (utilise les variables globales $voicemode [à savoir parler] et $commandLine [convertit la réponse en echo utf2win(), sinon juste echo]). $level indique le niveau d'importance de la phrase (en fonction des paramètres actuels pour le niveau minimum de prononciation, la phrase peut soit être exprimée soit simplement écrite dans l'historique des messages).

processCommand($commande)-- envoie une commande textuelle à exécuter (par exemple, "dire quelle heure il est"). Les commandes elles-mêmes sont configurées dans la méthode ThisComputer->commandReceived.

getGlobal($varname);-- obtenir la valeur de la propriété globale

setGlobal($varname,$value);-- définition de la propriété globale

processLine($ligne);-- exécuter le script de synchronisation

getRandomLine($filename);-- prendre une chaîne aléatoire à partir d'un fichier texte. $filename peut être abrégé, par exemple file1, puis le fichier sera pris./texts/file1.txt

playSound($filename);-- lecture d'un fichier (mp3, wav, etc.). $filename peut être abrégé, par exemple file1, puis le fichier sera pris./sounds/file1.mp3

playMedia($chemin);-- jouer de la musique à partir du répertoire $path. Exemple

runScript($id,$data);-- exécute le script avec l'identifiant donné. Le nom peut être utilisé comme identifiant

getLogger($context = null);-- renvoie un objet enregistreur. Exemples d'utilisation de l'enregistreur

Travailler avec des objets

$obj=getObject($nom);-- obtient l'objet nommé $name. Vous pouvez travailler avec l'objet reçu en utilisant les méthodes suivantes :
$obj->callMethod("method_name",$params);
$obj->setProperty("property_name",$value);
$obj->getProperty("nom_propriété");

callMethod("Object.Method", $params);-- appelle la méthode de l'objet avec les paramètres spécifiés (ce dernier est facultatif)

$command="Quelle heure est-il" ; callMethod("ThisComputer.commandReceived",array("command"=>$command));

cm

$value=getGlobal("Objet.Propriété");-- obtenir la valeur d'une propriété d'objet

gg-- nom alternatif de la fonction précédente

setGlobal("Object.Property",$value);-- définir la valeur d'une propriété d'objet

qc-- nom alternatif de la fonction précédente

$objects=getObjectsByClass("class_name");-- renvoie un tableau d'objets de la classe spécifiée sous forme de nom. Exemple de boucle sur les objets et de définition des valeurs de propriété : $objects=getObjectsByClass("class_name"); foreach($objects as $obj) ( setGlobal($obj["TITLE"].".property_name",1); )

Intervalles de temps

temps()-- renvoie l'heure actuelle au format d'horodatage.

timeConvert($tm)-- convertir l'heure du format hh:mm au format time() pour la date d'aujourd'hui

timeNow($tm)-- renvoie l'heure sous forme de texte comme "16 heures 40 minutes". Si $tm n'est pas défini, renvoie l'heure actuelle. $tm au format horaire.

estWeekEnd()-- jour de congé oui/non = 1/0 estJourSemaine()-- jour de la semaine oui/non = 1/0

timeIs($tm)-- vérifie si l'heure actuelle correspond à l'heure transmise au format hh:mm

timeBefore($tm)-- compare l'heure $tm (hh:mm) et l'heure actuelle. Si le courant est inférieur à 1 sinon 0

timeAfter($tm)-- compare l'heure $tm (hh:mm) et l'heure actuelle. Si le courant est supérieur à 1 sinon 0

timeBetween($tm1, $tm2)-- vérifie si l'heure actuelle est dans l'intervalle spécifié (chaque hh:mm, et $tm1 peut être supérieur à $tm2, par exemple 23:00 05:00)

ReconnaîtreHeure($texte)-- la fonction essaie d'extraire une heure/date spécifique de la phrase. Par exemple $text pourrait être "demain à 9h30" ou "dans 5 minutes"

Lors de l'appel d'une méthode (mais pas d'un script !), des variables sont disponibles :

$prevRun-- heure du dernier appel (au format d'horodatage)

$prevRunPassed-- combien de secondes se sont écoulées depuis le dernier appel

$ceci-- Pointeur sur soi. Utilisé dans les méthodes de classe. Par exemple:

$this->setProperty("status",1); // définit la propriété status sur 1, l'objet pour lequel elle est appelée

Tâches et événements planifiés

AddScheduledJob("title","commands",$datetime, $expire=60);-- $expire en secondes

ClearScheduledJob("titre");-- un masque comme "title%" peut être utilisé

SetTimeOut("title","commandes", $timeout);-- $timeout en secondes (similaire à AddScheduledJob("title","commands",time()+$timeout));

ClearTimeOut("titre");-- analogue de ClearScheduledJob("title");

timeOutExists("titre");-- renvoie l'identifiant de la tâche planifiée (ou 0 si aucun)

registerEvent($eventName, $details="",$expire_in=365);-- inscription à l'événement $eventName

RegisteredEventTime($eventName);-- renvoie la dernière heure d'enregistrement de l'événement $eventName (-1 s'il n'y a pas encore eu d'événement de ce type)

Envoi de mail

SendMail($from, $to, $subject, $body);-- envoie un e-mail à l'adresse spécifiée dans $to

SendMail_html($from, $to, $subject, $body);-- similaire à la fonction précédente, mais le corps de l'e-mail est supposé être au format HTML

Il y a quelque temps, l'activité du soi-disant partenariat non commercial "Vologda Association des associations de propriétaires (ZhSK) et des propriétaires de logements" est entrée dans le champ de vision de notre rédaction.

Comme le disent les dirigeants de l'Association HOA, les objectifs de la création et du fonctionnement du partenariat à but non lucratif "Vologda Association of HOA (HBC) and Homeowners" sont de former un système de coordination, d'information mutuelle et d'interaction des propriétaires, ainsi en tant que représentation et protection de leurs intérêts auprès des autorités de l'État, des collectivités locales et des organes judiciaires.


En réalité, cependant, comme dans la plupart des cas, tout n'est pas si simple.

Selon des données ouvertes, les fondateurs du NP "Association Vologda des HOA (ZhSK) et des propriétaires de logements" sont 2 personnes: Sukhikh Artyom Vladimirovich et Ivanov Nikolay Leonidovich.


Et l'Association HOA est également impliquée dans la politique, faisant la promotion de ses candidats aux élections en dépensant de l'argent.

Ces personnes agitent depuis plusieurs années les propriétaires pour qu'ils passent à l'autogestion de leur bien. L'objectif principal des fondateurs de l'association HOA est les immeubles d'habitation, dans lesquels les propriétaires de biens immobiliers (appartements) rêvent de créer leur propre partenariat.

Dans un premier temps, l'Association des associations de copropriétaires propose aux propriétaires une assistance dans la préparation des documents nécessaires à l'enregistrement des associations de copropriétaires. Les membres du conseil d'administration de ces HOA, en règle générale, sont des personnes éloignées de la sphère du logement et des services communaux et de la gestion des immeubles d'habitation, qui, en raison de leur intérêt matériel, deviennent complètement contrôlées par l'association HOA.

Le résultat d'une telle coopération est toujours le même : le manque d'indépendance du HOA dans le choix des contreparties, l'exécution de travaux à des prix gonflés, le retrait des fonds alloués à la réparation et à l'entretien des logements à des organismes contrôlés par l'Association HOA .

Schéma de NP "Association de HOA"

Que sait-on de ces organisations ?

1. LLC Royaume-Uni "Sokol".

Le directeur général et unique fondateur de l'organisation est Bazhenov Alexander Nikolaevich. Adresse légale : Vologda, st. Mira, décédé le 17 de. 211. Selon des informations provenant de sources ouvertes, cette adresse est le lieu d'enregistrement de six autres organisations, dont certaines sont en cours de liquidation.

Le représentant de Sokol LLC est Sukhikh Artem Vladimirovich par procuration délivrée pour dix ans, le même Sukhikh A.V. qui, avec Ivanov, est co-fondateur de l'Association HOA.

En avril 2019, nous avons reçu des informations sur des plaintes de résidents de la maison n ° 9 de la rue Lavrov dans la ville de Vologda concernant la saisie illégale d'une maison sous la direction de Sokol Management Company LLC.

Plus tôt, dans cet immeuble, les citoyens de l'initiative ont créé un HOA, qui gérait l'immeuble.

Dès que Sokol Management Company LLC a commencé la gestion, les propriétaires l'ont ressenti, comme ils le disent eux-mêmes. À la suite du lavage de l'échangeur de chaleur, un liquide de refroidissement est entré dans l'eau fournie aux habitants de la maison, à la suite de quoi l'eau est devenue verte. La moitié des maisons n'ont toujours pas d'eau chaude. Les tuyaux du sous-sol fuient constamment. La société de gestion "Sokol" LLC ne prend aucune mesure pour restituer l'eau chaude aux appartements des propriétaires et ne prend pas non plus de mesures pour réparer ou remplacer l'échangeur de chaleur. Le nettoyage des parties communes de la maison est de mauvaise qualité, et parfois pas du tout. La seule chose que Sokol Management Company LLC fait en temps opportun et avec une grande qualité est de disperser les reçus de paiement des services dans les boîtes aux lettres, et Sukhikh Artem se rend chez les propriétaires et demande un paiement. Les gens sont scandalisés d'être obligés de payer pour un travail qui n'est pas réellement effectué.

En outre, Sokol Management Company LLC tente de retirer des fonds, prétendument pour la réparation de l'un des ascenseurs de la maison, bien que, selon les résultats d'un examen technique, il soit conclu que l'ascenseur est en bon état et ne nécessite pas de réparations. .

En ce moment, mauvaise gestion de la maison numéro 9 dans la rue. Lavrov, Vologda a été confirmé par un rapport d'inspection réalisé concernant Sokol Management Company LLC Le 28 juin 2019, le Département de l'économie municipale de l'administration municipale de Vologda a émis une ordonnance visant à éliminer les violations des exigences de licence pour les organisations de gestion.

Il devient incompréhensible pourquoi le partenariat "non commercial" de l'association HOA, dont le but est d'aider les résidents à créer un HOA, fonctionne dans le sens opposé, éloignant les maisons du HOA vers des organisations contrôlées, qui est Sokol Management Company LLC.

Le directeur de la société de gestion LLC "Sokol" est le directeur Bazhenov Alexander, contrôlé par Ivanov N. et Sukhikh A.

Il convient de noter que grâce aux résidents attentionnés, la décision des propriétaires de choisir Sokol Management Company LLC a été déclarée illégale par le tribunal municipal de Vologda et complètement annulée.

2. LLC "SU-35"

Ulyana Pavlovna Borodiy et Maksim Alekseevich Dobrelya sont membres de OOO SU-35. Avec ce dernier, Sukhikh Artem entretient des relations d'affaires constantes.

À l'heure actuelle, par décision du tribunal arbitral de la région de Vologda, OOO "SU-35" a été reconnu comme insolvable (faillite) et la procédure de mise en faillite a été ouverte.

Initialement, le 10 avril 2017 entre Sukhikh A.V. et LLC "SU-35", un contrat de travail a été conclu, selon lequel Sukhikh a assumé les fonctions de directeur adjoint des affaires juridiques.

Puis, après l'introduction de la procédure de surveillance concernant la LLC "SU-35", Sukhikh et la direction de la LLC "Su-35" ont tenté de retirer de l'argent des comptes de règlement. Pour mettre en œuvre cette tentative, sans le consentement du directeur intérimaire, un accord a été conclu entre OOO SU-35 et Sukhikh pour modifier les termes existants du contrat.

En fait, au salaire mensuel précédemment convenu de 30 000 roubles 00 kopecks, en plus des paiements spécifiés, pour les mêmes fonctions qui ont été attribués à Sukhikh A.V. contrat de travail, parties une augmentation des salaires de 270 500 roubles a été convenuemensuel. (811 500 roubles pour la période du 28 avril 2018 au 17 juillet 2018)

Pour que le retrait de fonds ait l'air légal, le 20 novembre 2018, Sukhikh A.V. a déposé une demande de recouvrement des arriérés de salaire auprès de SU-35 LLC pour un montant de 1 082 229 roubles 99 kopecks Cependant, le tribunal municipal de Vologda a accordé les exigences Sukhih A.The. seulement partiellement, après avoir recouvré auprès de LLC "SU-35" une dette d'un montant de 70 117 roubles 46 kopecks.

Plus tard, le tribunal d'arbitrage de la région de Vologda a invalidé l'accord de modification des conditions existantes du contrat de travail. La décision du tribunal a été établie comportement déloyal Sukhih A.Le. , exprimé dans la conclusion de l'accord dans les conditions du fait de l'insolvabilité (faillite) de OOO SU-35 établi par le tribunal (dans la procédure de suivi), et l'accord sur les conditions d'augmentation des salaires pour l'exercice des fonctions de travail précédemment attribué à Sukhikh en vertu du contrat de travail, indiquant la présence de signes de nullité de la transaction, établi par l'article 10 du Code civil de la Fédération de Russie (une transaction effectuée en contournant la loi avec l'intention de causer un préjudice)

3. LLC "Metprom"

Artem Vladimirovich Sukhikh est le directeur de Metroprom LLC. À l'heure actuelle, Metrprom LLC a été liquidée par décision du Service fédéral des impôts. Le registre des personnes morales en relation avec Metprom LLC contient des informations sur l'inexactitude des données sur l'adresse de la personne morale.

Le manque de fiabilité de l'adresse légale est l'un des signes de l'organisation "un jour"

Que sait-on d'autre de Sukhikh Artyom Vladimirovitch ?


En tant que fondateur et avocat de NP "Association of HOA", Sukhikh fournit des services juridiques aux associations de propriétaires.

Comme nous l'avons appris, avec le HOA à l'adresse Vologda, voie technique, 56 à l'association HOA représentée par Sukhikh A.V. un accord a été conclu pour la fourniture de services de recouvrement de créances auprès des propriétaires qui devaient des services de réparation et d'entretien de locaux non résidentiels. Le coût d'un tel service était estimé à vingt mille roubles. (par rapport au marché surestimé de 10 fois), cependant, selon le président du HOA, les services de recouvrement de créances n'ont pas été fournis pour une raison farfelue de Sukhikh A.V.. Les tentatives de restitution de l'argent ont échoué, puisque Nikolai Ivanov, président de l'association HOA, a nié son lien avec Sukhikh de toutes les manières possibles, bien qu'en fait le lien soit évident, puisque Sukhikh est co-fondateur de l'association. L'argent n'a jamais été rendu au président.

Nous connaissons également un autre cas de services juridiques de mauvaise qualité rendus à une association de propriétaires.

En décembre 2016, Sukhikh A.V. au nom du HOA, il a déposé une réclamation contre l'un des promoteurs pour le recouvrement du coût des travaux nécessaires pour éliminer les lacunes commises lors de la construction de la maison. En décembre 2018, le tribunal arbitral de la région de Vologda a rejeté les demandes dans leur intégralité. Dans sa décision, le tribunal a déclaré ce qui suit :

"Le tribunal a également pris en compte et reconnu comme justifiée la déclaration de tous les prévenus sur l'abus par le demandeur de son droit, qui, sachant qu'au moment du dépôt de la demande, le promoteur avait lancé une procédure de liquidation, et pendant la procès, le représentant de ce prévenu a immédiatement notifié au tribunal qu'il retenait l'affaire pour poursuite de la société, il n'a jamais déposé de demande d'inscription au registre des créances, n'a pas usé de ses droits de créancier dans le cadre de la faillite cas du défendeur, n'a pas participé à l'assemblée des créanciers, prétend engager la responsabilité subsidiaire des participants de la société, s'il y a lieu, n'a pas déclaré, c'est-à-dire qu'il a volontairement refusé d'exercer les droits qui lui ont été accordés par droit.

Le résultat d'une telle réclamation s'est avéré être triste pour le HOA. Ayant cru aux promesses de l'Association HOA et espérant la haute qualification de Sukhikh A.V. En échange de fonds pour l'élimination des défauts de construction, le HOA n'a reçu que des frais juridiques sous la forme d'une taxe d'État d'un montant de 43 003 roubles, d'énormes dépenses pour la réalisation d'un examen de construction, dont le coût dépassait 100 000 roubles, et des frais pour payer les services d'un "spécialiste de haut niveau" Sukhikh AV , ainsi qu'une bataille juridique de deux ans avec une issue prédéterminée. De ce fait, seule l'association « Association sans but lucratif » des associations de copropriétaires s'est « enrichie »

Refus du HOA, représenté par le représentant Sukhikh A.V. , dès l'exercice de leurs droits, laisse supposer un volet corruption avec un promoteur en faillite. En conséquence, les victimes ne sont que celles qui vivent dans la maison du promoteur avec des défauts de construction, lorsque Sukhikh A.V. reçoit de l'argent pour ses services, et le promoteur est liquidé avec succès sans recevoir le moindre obstacle.

Le résultat du travail de l'Association HOA est prévisible et bien triste. Les propriétaires reçoivent une indépendance imaginaire et un pouvoir imaginaire sur leur propriété, et l'Association HOA et les organisations contrôlées par elle s'enrichissent aux dépens des propriétaires. La responsabilité de toutes les actions dans ce cas, en vertu de la législation en vigueur, incombe à l'HOA elle-même, tandis que l'association n'assume aucune responsabilité pour ses actions.

À suivre.

Je vais exprimer mon opinion sur le produit, peut-être qu'il sera utile à quelqu'un.
Les spécialistes, tout d'abord, les intégrateurs ne seront probablement pas intéressés par MajorDoMo, tant qu'il n'y a ni produit en boîte normal, ni documentation technique normale, ni support 7/24, ni réseau de revendeurs, ni bonus.

Il est également peu probable que les auto-constructeurs s'y intéressent, il n'y a pas de différences globales avec, disons, OpenHab ou ioBroker.

Mais pour ceux qui vont juste construire un système de maison intelligente et qui veulent comprendre ce qu'ils veulent encore et ce qu'une maison intelligente peut faire, il est probablement logique de bricoler le système pendant un certain temps. Personnellement, j'ai déjà accroché plusieurs dizaines d'amis sur MajorDoMo.

Tout se passe ringard, le soir les invités viennent faire un barbecue - bukhaching. Au crépuscule, MajorDoMo allume automatiquement la lumière sur la véranda, afin d'améliorer l'effet, je donne une commande vocale à UD pour allumer la radio ou la musique. contrôler vocalement le niveau sonore ou passer à une autre station de radio ou piste.

Ensuite, j'amène des invités dans la maison et encore une fois, d'une voix, je demande à la maison intelligente de parler d'elle-même. (J'ai un tel mode démo configuré). UD commence à allumer et éteindre les lumières, dit les prévisions météorologiques, allume les téléviseurs, se sépare et une douzaine de spectacles différents.

Après avoir répondu à la question, combien cela coûte-t-il ? est libre. Considérez que le client a mûri.

Ce n'est qu'après avoir passé quelques heures sur ces leçons, sans connaissances de base en programmation, sans comprendre la logique, la structure et d'autres choses, en répétant bêtement toutes les actions de la vidéo, que vous pourrez le faire.

Réglez une alarme sur votre ordinateur avec votre voix pour jouer lorsque la musique ou la radio est déclenchée
Contrôlez le lecteur multimédia sur votre ordinateur avec votre voix
Organisez la vidéosurveillance à l'aide de n'importe quel smartphone ou tablette
Suivre le mouvement et trouver, par exemple, des enfants par GPS
Gérez les stations de radio en ligne sur votre ordinateur avec votre voix
Obtenez une liste de courses intelligente
Écoutez les prévisions météo sur votre ordinateur avec votre voix
Voix poser des questions et obtenir des réponses à partir du wiki
Voice ajouter et supprimer des tâches du journal.
Rappels vocaux.
Recevez le taux de change actuel par voie vocale sur demande
Lire les SMS entrants par la voix
Arrêter l'ordinateur à distance
Surveillez la charge de la batterie sur votre smartphone et recevez des notifications en cas de baisse critique de la charge
Écoutez avec votre voix les gros titres ou les nouvelles elles-mêmes et les synopsis de films

Merde fatigué d'écrire, eh bien, il y a beaucoup plus ...

Et tout cela n'est pas écrit une seule ligne de code (tout le code est posté sous la vidéo)

Au cours de la dernière année et demie, de plus en plus d'intégrateurs et de personnes du secteur de la construction nous ont demandé de nous apprendre à travailler avec des logiciels et à "faire une maison intelligente".
Actuellement, plusieurs dizaines d'intégrateurs (dans toute la CEI) implémentent Smart Homes sur Majordomo. Nous ne leur payons rien (ni bonus, ni remises concessionnaires) - c'est vrai. MAIS leurs clients n'ont pas besoin de payer pour le logiciel. Et avec l'aide de Majordomo, utilisez un équipement plus économique.
Tout cela réduit considérablement le coût final pour les clients.

Selon la documentation - nous avons créé une base de connaissances, nous allons la remplir petit à petit

Concernant Openhab/ioBroker vs Majordomo - je connais beaucoup de cas où des gars sont passés d'Openhab/ioBroker à nous - pour la même raison : il n'y a pas de grande différence, mais il y a beaucoup plus d'utilisateurs russophones, et il y a quelqu'un à qui parler pour