שליטה על Switcher Touch או V2 עם openHAB

בית חכם, עוזרות חכמות, חשמל חכם, מערכות שליטה ובקרה, Amazon Echo, Alexa, Google home, Control4, RTI, מנעולים חכמים ועוד.
jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

מישהו פה כבר כתב ל OpenHAB את ה items, rules, sitemap וכו' לשליטה וקריאת מצב ה Switcher ויכול לשתף?
תודה.
נערך לאחרונה על ידי jagheadg ב 20/10/2020 20:02, נערך פעם 1 בסך הכל.

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

מצאתי כבר משהו בקהילה באינטרנט.
https://community.openhab.org/t/transfo ... ut/84319/8

עובד מעולה.
לא צריך את האפליקציה שלהם בכלל.

zovirax
סמל אישי של משתמש
חבר במועדון ה-15K
חבר במועדון ה-15K
תגובות: 15949
הצטרף: פברואר 2006
שם מלא: zovirax

שליחה

jagheadg כתב:מצאתי כבר משהו בקהילה באינטרנט.
https://community.openhab.org/t/transfo ... ut/84319/8

עובד מעולה.
לא צריך את האפליקציה שלהם בכלל.
...
·וואלה? כזה יש לך?


https://ksp.co.il/m/uin/46082

אני מזמין לי עכשיו כזה

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

יש לי את גרסת ה Touch .
זה לא משנה הם עובדים אותו הדבר.

zovirax
סמל אישי של משתמש
חבר במועדון ה-15K
חבר במועדון ה-15K
תגובות: 15949
הצטרף: פברואר 2006
שם מלא: zovirax

שליחה

@jagheadg
ב github יש סקריפטים של python
אבל איך אתה עושה binding ב opebhab?

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

מגדירים thing ידנית בקובץ שמריץ את הסריפט עם binding EXEC.
https://www.openhab.org/addons/bindings/exec/

Thing exec:command:SwitcherAll [command="python /etc/openhab2/scripts/switcher.py 2", interval=60, timeout=10, autorun=false]

zovirax
סמל אישי של משתמש
חבר במועדון ה-15K
חבר במועדון ה-15K
תגובות: 15949
הצטרף: פברואר 2006
שם מלא: zovirax

שליחה

@jagheadg

תודה רבה!!!
ראיתי שיש לך צרות עם הסוויצ'ר... חוסר אמינות שלו (שירשור אחר שלך)
זה קורה בגלל האפליקציה שלהם ? משהו שעקפת עם ה openhab?

dr0r
חבר ותיק
חבר ותיק
תגובות: 2200
הצטרף: נובמבר 2018
שם מלא: דרור
מיקום: תל אביב

שליחה

@zovirax

עדיף לך בהרבה לקנות את ה-Tuya. חצי מחיר, נראה יותר טוב, לא צריך להתעסק עם החברה המפוקפקת שנקראת MDS טכנולוגיות אלחוטיות, ושליטה עם MQTT מ-OH.

zovirax
סמל אישי של משתמש
חבר במועדון ה-15K
חבר במועדון ה-15K
תגובות: 15949
הצטרף: פברואר 2006
שם מלא: zovirax

שליחה

@dr0r
תוכל לתת לי לינק?

הבאסה שזה יגיע בערך בקיץ (לאחרונה חבילות לוקח להם מלא זמן)

dr0r
חבר ותיק
חבר ותיק
תגובות: 2200
הצטרף: נובמבר 2018
שם מלא: דרור
מיקום: תל אביב

שליחה

@zovirax
יש הרבה מוכרים, לדוגמא כאן או כאן. תחסוך חצי דולר בערך אם תחכה ל-11/11.

יש שירשור בנושא פה, עם פרטים על החלפת ה-firmware. התקנת ה-firmware החלופי עבדה כמו קסם, ומאותו הרגע יש לך שליטה מלאה, בלי כל תקשורת לשרתים סיניים - רק צריך להיזהר לא לחבר את המפסק לרשת לפני שמחליפים לו את ה-firmware. המפסקים האלה נמכרים בארץ ב-300₪ ע״י switcheat ו-homeetec, עם תוכנה מתורגמת שמתחברת לשרתים הסיניים של Tuya...

אבל כן, יש לי חבילות שנשלחו לפני חודשיים והן עדיין בדרך.

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

@zovirax
·
אין יותר בעיות. עובד בסדר גמור.
ניתוק וחיבור מהחשמל סידר הכל חוץ מהאפליקציה שלהם לאנדרואיד שממש עושה צרות.
בגלל זה הרמתי את השליטה מ OH. עוקף את אפליקציה בצורה מלאה.

zovirax
סמל אישי של משתמש
חבר במועדון ה-15K
חבר במועדון ה-15K
תגובות: 15949
הצטרף: פברואר 2006
שם מלא: zovirax

שליחה

@dr0r

שיכנעת אותי
הזמנתי לי אחד... ויתרתי על הסוויצ'ר למרות הזמינות שלו

רק שאלה ... ראיתי דיבורים על GPIO בשירשור שצירפת
האם זה רלוונטי ? או רק הסקריפט ב github?

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

אז אחרי הרבה זמן הגעתי לממש שליטה בסיסית על switcher מתוך openHAB.
אפשר לקחת את הדוגמה הזו ולממש יותר שליטה.
בגלל מגבלות הפורום להלן קישור למסמך המפרט את ההוראות הבסיסיות למימוש השליטה.
מקווה שיהיה ברור.

https://app.box.com/s/u70jq9vv7k4q25i1ql62j24jpcb5oqls

razserv2010
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013

Re:

שליחה

20/10/2020 20:02  
jagheadg כתב:
אז אחרי הרבה זמן הגעתי לממש שליטה בסיסית על switcher מתוך openHAB.
אפשר לקחת את הדוגמה הזו ולממש יותר שליטה.
בגלל מגבלות הפורום להלן קישור למסמך המפרט את ההוראות הבסיסיות למימוש השליטה.
מקווה שיהיה ברור.

https://app.box.com/s/u70jq9vv7k4q25i1ql62j24jpcb5oqls
...
תודה, עובד מעולה גם על הplug וגם על v3 Touch
צילום מסך 2020-10-31 085506.jpg
צילום מסך 2020-10-31 085537.jpg
נא להרשם/להכנס לחשבון בפורום על מנת לצפות בקבצים או בתמונות המצורפים לשרשור

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

שיפור קטן לקוד בקובץ: הוספתי אינדיקציה לזמן שנותר עד לכיבוי האוטומטי.

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011

שליחה

@jagheadgתודה על המדריך.
אחרי הרבה זמן גם אני מנסה כעת לשלוט על ה- Switcher דרך openHAB, אבל משום מה מתקשה לעבור את השלב הראשון.
לפי מה שקראתי על הסקריפט ב github צריך לחלץ מס' נתונים מה- Switcher וניתן לעשות זאת באמצעות הרצה עם הפקודה extract.
מנסה לעקוב אחר ההוראות אבל לא מצליח לקבל את הנתונים הנחוצים.

אני עובד עם אייפון כך שזאת הדרך היחידה להבנתי לקבל את הנתונים (לפני שאחפש מכשיר android חלופי עם root).
עד כה לא ניסיתי להריץ את הסקריפט ללא הנתונים, כן עדכנתי את ה IP של ה Switcher.

מישהו יכול לחלוק בנוגע לביצוע החלק הזה?

תודה מראש!

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

לא צריך יותר מכשיר נייד כדי להוציא נתונים. רק להריץ את הפקודה ב SHELL ולקבל משם מה שצריך.
מספיק רק device_id ו - device_pass
אין צורך ב phone_id
הסקריפט מוצא לבד את מה שהוא צריך רק כדאי לתת לסוויטצ'ר כתובת קבועה מראש ברשת כשההגדרה בראוטר תהיה לפי כתובת ה MAC .

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011

שליחה

הי תודה רבה, הסתדר ועובד. מאוד מעריך את השיתוף של הקבצים שלך.

יש לי כמה שאלות לגבי המימוש שלך:
  • 1. ראיתי שב- sitemap שלך מופיע item של BoilerTemperatureSensor- מניח שמדובר במה שכתוב- חיישן טמפרטורה לדוד המים. אפשר לשאול איזה חיישן זה? האם משהו ייעודי או אלתור של חיישן טמפרטורה רגיל?
    2. בשורה 10 של קובץ ה- rules שלך לדעתי יש טעות קטנה. כתוב SwitcherAllCommandOutput במקום Switcher_Command_Output. לא יודע אם זה קריטי לך או לא אבל שתכיר. אלא אם אני טועה ולא הבנתי שם משהו נכון...
    3. לא עבדתי הרבה עם Exec Binding ואני כנראה לא מבין נכון את עקרון הפעולה. למעשה הפקודה הראשונה שהגדרת SiwtcherAll היא שקולה להרצת הפקודה השניה SwitcherSet עם SwitcherArgs ששווה ל- 2. ובנוסף אני לא מבין מתי הפקודה SwitcherAll רצה- לא קישרתי את עורץ ה- running לשום דבר ולא הפעלתי אותו.יחד עם זאת אני רואה שאחרי כל ריצה של SwitcherSet, משתנה הערך של Switcher_Command_Output. מה אני מפספס בעקרון העבודה? איך ה- output של הפקודה מתקבל אם הפקודה עצמה לא רצה?
    4. ועוד הערה קטנה לגבי החוק "Switcher execution"- מחוויות העבר חוקים שמופעלים ע"י received command לעיתים רצים לפני שה state של ה- item התעדכן. לא יודע עד כמה זה קריטי כאן (אין לי הרבה ניסיון עם Exec Binding כמו שאמרתי) אבל זה הרגיש לי שעשוי להיות מצב שהפקודה תרוץ עם ערך קודם של Args. שיניתי את הטריגר אצלי ל- changed ואבדוק אם יש נפילות.
שוב המון תודה ואשמח אם תוכל לסייע עוד קצת בהבנת המנגנון.

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011

שליחה

@jagheadg
הי שוב תודה על המדריך. עשיתי כמה שינויים במימוש אצלי ואשמח לחלוק למקרה שיסייע.

קודם כל הוספתי הרצת הסקריפט הראשון (כלומר switcher.py 2) בכל סיום של הסקריפט עם פקודה כלשהיא. כך הוא מתעדכן לאחר כל ריצה. לא יודע אם זאת הדרך הכי טובה אבל היא זאת שעובדת לי.

בנוסף, ב- sitemap אני מציג את ה switch של ההפעלה בלבד (בלי ה- string של ה- status) אבל לאחר כל ריצה ועדכון מצב אני מעדכן אותו עם המצב הנוכחי (postUpdate) כך שהוא גם מעודכן וגם משמש כמתג הפעלה למשתמש.

כדי להפעיל טיימר הגדרתי item מסוג Number וב- sitemap אני שולט עליו ע"י slider בין 0 ל- 60.
לאחר מכן בלחיצה על הפעלת הטיימר החוק הרלוונטי מעדכן את ה- Args ב- "t" + המס'.
כך יש גמישות רבה יותר בהפעלת הטיימר.

להלן המימושים שלי, כאמור מאוד מבוססים על של @jagheadg , חלק מהשינויים שלי הם עניין של נוחות וסגנון אישי, חלק קשורים לתחושתי לעבודה נכונה עם openHAB (סוג של קטנוניות... סליחה מראש... :lol: ):
קובץ ה items (ללא כל מיני קישוטים של תגיות ואייקונים):

קוד: בחירת הכל

Switch BR_Dude_PowerSwitch "Dude Power Switch"
String BR_Dude_PowerStatus "Dude Power Status [%s]"
Number BR_Dude_TimerMin "Dude Set Timer"                 
Switch BR_Dude_StartTimer "Dude Start Timer"
String BR_Dude_TimeRemaining "Dude Time Remaining [%s]"
Number BR_Dude_Current "Dude Current Consumption [%.1f A]"
Number BR_Dude_PowerConsumption "Dude Power Consumption [%.0f W]"
Switch BR_Dude_GetStatusCommand "Dude Get Status Execution"                                {channel="exec:command:SwitcherGet:run"}
String BR_Dude_GetStatusOutput "Dude Get Status Command Output [%s]"                       {channel="exec:command:SwitcherGet:output"}
DateTime BR_Dude_LastStatusUpdate "Last Update [%1$td/%1$tm, %1$tH:%1$tM]"                 {channel="exec:command:SwitcherGet:lastexecution"}
Switch BR_Dude_SetCommand "Dude Setting Command Execution"                                 {channel="exec:command:SwitcherSet:run", autoupdate="false"}
String BR_Dude_SetArgs "Dude Arguments For The Command Line"                               {channel="exec:command:SwitcherSet:input"}
String BR_Dude_SetCommandOutput "Dude Setting Command Output"                              {channel="exec:command:SwitcherSet:output"}

קובץ ה- sitemap:

קוד: בחירת הכל

Text label="Dude" item=BR_Dude_PowerSwitch icon="boiler" {
            Frame label="Control" {
                Switch item=BR_Dude_PowerSwitch     label="Power Switch"    icon="switcher"     mappings=[OFF="OFF", ON="ON"]
                Slider item=BR_Dude_TimerMin        label="Timer [%d]"      icon="time"         minValue=0 maxValue=60 step=5
                Switch item=BR_Dude_StartTimer      label="Start Timer"     icon="send"         mappings=[ON="START"]
            }
            
            Frame label="Status" {
                Text item=BR_Dude_Current label="Current [%.1f A]"          icon="plug"
                Text item=BR_Dude_PowerConsumption label="Power [%.0f W]"   icon="plug"
                Text item=BR_Dude_TimeRemaining label="Time Remaining [%s]" icon="time"
            }

            Frame label="Statistics" {
                Text label="To Do ..."
            }
        }
קובץ החוקים:

קוד: בחירת הכל

val String filename = "dude.rules"
var Timer timer = null

//  Usage of switcher.py:
//  =====================
//  Off command:                            switcher.py 0
//  On command:                             switcher.py 1
//  On command duration in minutes:         switcher.py t30
//  Get State:                              switcher.py 2
//  Set Auto shutdown setting (in hours):   switcher.py m03:00
//  Retrieve Schedule from device:          switcher.py list
//  Create a Schedule:                      switcher.py create
//  Delete Schedule from device:            switcher.py del
//  Enable Schedule:                        switcher.py enable
//  Disable Schedule:                       switcher.py disable

rule "Switcher On Off"
when
    Item BR_Dude_PowerSwitch received command
then
    if (receivedCommand == ON) {
        BR_Dude_SetArgs.sendCommand("1")
        logInfo(filename, "Dude Will Turn ON")
    } else {
        BR_Dude_SetArgs.sendCommand("0")
        logInfo(filename, "Dude Will Turn OFF")
    }
end

rule "Switcher Timer"
when
    Item BR_Dude_StartTimer received command ON
then
    BR_Dude_SetArgs.sendCommand("t" + BR_Dude_TimerMin.state.toString)
    logInfo(filename, "Dude Will Turn With Timer: " + BR_Dude_TimerMin.state)
end

rule "Switcher Setting Srcipt Execution"
when
    Item BR_Dude_SetArgs received command
then
    if (BR_Dude_SetCommand.state != ON) {
        logInfo(filename, "Dude Run Script with Args: " + receivedCommand)
        BR_Dude_SetCommand.sendCommand(ON)
    } else {
        logInfo(filename, "Dude Script Already in Use, Skipping Execution")
    }
end

rule "Switcher complete"
when
   Item BR_Dude_SetCommand changed from ON to OFF
then
    logInfo(filename, "Dude Script Has Completed. Refreshing Status...")
    BR_Dude_GetStatusCommand.sendCommand(ON)
end



rule "Switcher Status Output"
when
    Item BR_Dude_GetStatusOutput received update 
then 
// --- Sending Login Packet to Switcher...
// --- Received SessionID: 00000000
// --- Getting Switcher state...
// --- Device Name: Switcher
// --- Device is ON
// --- Electric Current is: 11.5(A)
// --- Power consumption is: 2535(W)
// --- Device is configured to auto shutdown in: 2:00 hour(s)
// --- Auto shutdown device in: 1:59:25
// --- Done!
    logInfo(filename, "BR_Dude_GetStatusOutput changed")
    if ( BR_Dude_GetStatusOutput.state.toString.length > 6 ) {    
        val switcherResponse = BR_Dude_GetStatusOutput.state.toString.split('--- ')
        
        var switcherStatus = switcherResponse.get(5).trim
        var switcherCurrent = switcherResponse.get(6).trim
        var switcherPowerConsumption = switcherResponse.get(7).trim
		var switcherTimeRemaining = switcherResponse.get(9).trim

        
        switcherStatus = transform("REGEX", "Device is (.*)", switcherStatus.toString)
        logInfo(filename, "Dude State is: " + switcherStatus)
        BR_Dude_PowerStatus.postUpdate(switcherStatus)
        if (switcherStatus == "ON") {
            BR_Dude_PowerSwitch.postUpdate(ON)
        } else if (switcherStatus == "OFF") {
            BR_Dude_PowerSwitch.postUpdate(OFF)
        }
        
        switcherCurrent = transform("REGEX","Electric Current is: (.*)A", switcherCurrent.toString)
        logInfo(filename, "Dude Current Consumtion is: " + switcherCurrent)
        BR_Dude_Current.postUpdate(switcherCurrent)

        switcherPowerConsumption = transform("REGEX", "Power consumption is: (.*)W", switcherPowerConsumption.toString)
        logInfo(filename, "Dude Power Consumtion is: " + switcherPowerConsumption)
        BR_Dude_PowerConsumption.postUpdate(switcherPowerConsumption)

        switcherTimeRemaining = transform("REGEX", "Auto shutdown device in: (.*)", switcherTimeRemaining.toString)
        logInfo(filename, "Dude Time Remaining is: " + switcherTimeRemaining)
        BR_Dude_TimeRemaining.postUpdate(switcherTimeRemaining)

    } else {
        logInfo(filename, "--- Switcher ERROR Reading state ---")
        return;
    }
end

rule "Switcher Set Script Output"
when
   Item BR_Dude_SetCommandOutput changed
then
// --- Received SessionID: 00000000
// --- Getting Switcher state...
// --- Device Name: Dude
// --- Turning Switcher ON for 15 minutes...
// --- Done!
   logInfo(filename, "Raw result:" + BR_Dude_SetCommandOutput.state )
end

שאלה פתוחה אצלי- איך לוודא שהסטטוס שמופיע ב- OH מעודכן כל הזמן. כי לא תמיד אני אפעיל את הדוד מ- OH- לפעמים מהאפליקציה (תזמונים וכו') ולפעמים ידנית.
ה- Switcher לא דוחף עדכונים כי אין Binding מסודר, מצד שני לתשאל כל 5 דקות נראה לי לא סביר ואין לי מושג איך הרכיב או כל המערכת תגיב לזה.
אם מישהו חשב על פיתרון או רעיון אשמח לשמוע את הגישות השונות.

שוב תודה על המדריך, נתן לי נקודת התחלה קרובה מאוד לתוצאה הסופית.

jagheadg פותח השרשור
חבר ותיק
חבר ותיק
תגובות: 1184
הצטרף: דצמבר 2010
מיקום: כפר הדרדסים

שליחה

@chentaמעולה שהצלחת להפעיל. הצעות ושיפורים מתקבלים בברכה. כולם מרוויחים מהשיתוף.

לגבי החיישן טמפרטורה, כן, זה חיישן שבניתי לבד ומדווח ב MQTT על הטמפרטורה של המים (בקירוב). הוא מבוסס על ESP8266 עם DS1820 שמוצמד לכניסת המים העליונה מהקולטי שמש. בגלל שהצינור מתכתי הוא מוליך יחסית טוב את חום המים בחלק העליון של הדוד.

בנושא הטיימר, לטעמי אין צורך ברזולוציה של דקות, קביעה מראש בקפיצות של 15 דקות מספקת. שוב זו דעתי.

לגבי עדכון ה ITEM על ה STATUS גם כשמפעילים מהכפתור של הדוד, העדכון האוטומטי כל 30 שניות בהרצת הסקריפט לא מזיקה.
עובד ככה כבר שנתיים.

קוד: בחירת הכל

Thing exec:command:SwitcherAll [ command="/usr/bin/python /etc/openhab2/scripts/switcher.py 2" , interval=30 , timeout=5 , autorun=false]

חזור אל “בית חכם ובקרה”